Add Across Predict withdraw plumbing#8759
Merged
Merged
Conversation
ad1509e to
a4ae73b
Compare
This was referenced May 11, 2026
a4ae73b to
6077863
Compare
6077863 to
fc6f92e
Compare
jpuri
approved these changes
May 12, 2026
pull Bot
pushed a commit
to dmrazzy/core
that referenced
this pull request
May 13, 2026
## Summary This is PR 2 of 4 in the core stack for Predict withdraws over Across. - Adds Across quote construction for post-quote Predict withdraws. - Uses exact-input quotes without destination actions for the post-quote withdraw flow. - Preserves provider fees, target totals, and original transaction gas when normalizing quotes. - Re-quotes post-quote withdraws after reserving source token for source-chain gas paid with the source token. ## Stack 1. MetaMask#8759: plumbing to identify Predict Across withdraws 2. This PR: quote support 3. MetaMask#8761: submit support 4. MetaMask#8762: gas payment edge cases ## Validation - `yarn workspace @metamask/transaction-pay-controller run jest --no-coverage src/strategy/across/across-quotes.test.ts src/strategy/across/AcrossStrategy.test.ts` - Full stack validation was run on the final stacked branch: - `yarn changelog:validate` - `yarn workspace @metamask/transaction-pay-controller run test` - `yarn workspace @metamask/transaction-controller run test` <!-- CURSOR_SUMMARY --> --- > [!NOTE] > **Medium Risk** > Medium risk because it changes Across quote construction and gas/fee calculations for post-quote Predict withdraw flows, including special-casing EIP-7702 authorization-list handling and multi-phase re-quoting logic that could affect pricing and execution safety. > > **Overview** > Adds Across **quote support for post-quote Predict withdraws**, switching these requests to `exactInput` quoting with **no destination actions** and passing `refundAddress` through to the Across `/swap/approval` request. > > Updates gas/fee normalization to **include the original withdrawal transaction’s gas** in `sourceNetwork`/`gasLimits` for post-quote quotes, and extends the existing two-phase “reserve source token for gas-fee-token” re-quote flow to *also* apply to post-quote Predict withdraws (now failing hard on unsafe/invalid phase-2 outcomes instead of falling back). > > Relaxes Across strategy quote support checks to allow first-time EIP-7702 `requiresAuthorizationList` **only** for post-quote Predict withdraw quotes that have no embedded Across actions, and updates types/tests accordingly (including persisting `actions` in the quote’s `original.request`). > > <sup>Reviewed by [Cursor Bugbot](https://cursor.com/bugbot) for commit a65c549. Bugbot is set up for automated code reviews on this repo. Configure [here](https://www.cursor.com/dashboard/bugbot).</sup> <!-- /CURSOR_SUMMARY -->
pull Bot
pushed a commit
to Reality2byte/core
that referenced
this pull request
May 13, 2026
## Explanation Release `980.0.0` with minor version bumps for: - **`@metamask/transaction-controller`** `65.3.0` → `65.4.0` - **`@metamask/transaction-pay-controller`** `22.3.1` → `22.4.0` ### `@metamask/transaction-controller@65.4.0` #### Added - Add optional `fiat` object (with `orderId` and `provider` properties) to `MetamaskPayMetadata` type for persisting fiat on-ramp order data on transactions - Add `predictAcrossWithdraw` to the `TransactionType` enum #### Changed - `estimateGasBatch` now falls back to the sum of per-tx `gas` values in the EIP-7702 path when node simulation fails, instead of returning the block-gas-limit fallback - Bump `@metamask/network-controller` from `^31.0.0` to `^32.0.0` - Bump `@metamask/accounts-controller` from `^38.1.0` to `^38.1.1` - Bump `@metamask/controller-utils` from `^12.0.0` to `^12.1.0` ### `@metamask/transaction-pay-controller@22.4.0` #### Added - Add Across quote support for post-quote Predict withdraw flows #### Changed - Derive fiat order source amount from on-chain transaction data (`order.txHash`) with fallback to `order.cryptoAmount` - Persist fiat order ID and provider code on `transaction.metamaskPay` before polling, so activity views can query order status after controller state cleanup - Bump `@metamask/assets-controller` from `^7.1.1` to `^7.1.2` - Bump `@metamask/assets-controllers` from `^108.0.0` to `^108.1.0` #### Fixed - For postquote payments payment token for MM Pay transaction should not be reset when accountOverride is changed ### Dependency updates 14 packages had their `@metamask/transaction-controller` dependency range updated from `^65.3.0` to `^65.4.0` with corresponding changelog entries under `[Unreleased]`: - `@metamask/assets-controller` - `@metamask/assets-controllers` - `@metamask/bridge-controller` - `@metamask/bridge-status-controller` - `@metamask/earn-controller` - `@metamask/eip-5792-middleware` - `@metamask/gator-permissions-controller` - `@metamask/network-enablement-controller` - `@metamask/perps-controller` - `@metamask/phishing-controller` - `@metamask/profile-metrics-controller` - `@metamask/shield-controller` - `@metamask/subscription-controller` - `@metamask/user-operation-controller` ## References - [MetaMask#8694](MetaMask#8694) — Add fiat on-ramp order data persistence on transactions - [MetaMask#8759](MetaMask#8759) — Add `predictAcrossWithdraw` transaction type - [MetaMask#8735](MetaMask#8735) — EIP-7702 gas estimation fallback improvements - [MetaMask#8760](MetaMask#8760) — Across quote support for post-quote Predict withdraw - [MetaMask#8787](MetaMask#8787) — Fix payment token reset on accountOverride change ## Checklist - [ ] I've updated the test suite for new or updated code as appropriate - [ ] I've updated documentation (JSDoc, Markdown, etc.) for new or updated code as appropriate - [x] I've communicated my changes to consumers by [updating changelogs for packages I've changed](https://github.com/MetaMask/core/tree/main/docs/processes/updating-changelogs.md) - [ ] I've introduced [breaking changes](https://github.com/MetaMask/core/tree/main/docs/processes/breaking-changes.md) in this PR and have prepared draft pull requests for clients and consumer packages to resolve them <!-- CURSOR_SUMMARY --> --- > [!NOTE] > **Medium Risk** > Mainly a release/version bump, but it pulls in updated `@metamask/transaction-controller` behavior (gas estimation fallback, new metadata/type fields) across many dependent controllers, which could affect transaction handling paths. > > **Overview** > Bumps the monorepo release to `980.0.0`, publishes `@metamask/transaction-controller@65.4.0`, and publishes `@metamask/transaction-pay-controller@22.4.0` (with corresponding changelog link updates). > > Propagates the `@metamask/transaction-controller` dependency range from `^65.3.0` to `^65.4.0` across multiple packages (e.g. assets/bridge/network-enablement/perps/phishing/shield/subscription/user-operation controllers) and records the bumps in each package’s `[Unreleased]` changelog entries, with `yarn.lock` updates to match. > > <sup>Reviewed by [Cursor Bugbot](https://cursor.com/bugbot) for commit 699b516. Bugbot is set up for automated code reviews on this repo. Configure [here](https://www.cursor.com/dashboard/bugbot).</sup> <!-- /CURSOR_SUMMARY --> --------- Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
pull Bot
pushed a commit
to dmrazzy/core
that referenced
this pull request
May 14, 2026
## Summary This is PR 3 of 4 in the core stack for Predict withdraws over Across. - Prepends the original Predict withdraw transaction when submitting post-quote Across flows. - Uses `TransactionType.predictAcrossWithdraw` for the Across deposit leg. - Forces 7702 batch submission when the parent withdraw transaction already has an authorization list. - Estimates final 7702 submit gas when the submit-time batch shape differs from the quote-time batch shape. - Moves original transaction gas parsing into a shared Across helper used by quote and submit paths. ## Stack 1. MetaMask#8759: plumbing to identify Predict Across withdraws 2. MetaMask#8760: quote support 3. This PR: submit support 4. MetaMask#8762: gas payment edge cases ## Validation - `yarn workspace @metamask/transaction-pay-controller run jest --no-coverage src/strategy/across/across-submit.test.ts src/strategy/across/across-quotes.test.ts src/strategy/across/AcrossStrategy.test.ts` - Full stack validation was run on the final stacked branch: - `yarn changelog:validate` - `yarn workspace @metamask/transaction-pay-controller run test` - `yarn workspace @metamask/transaction-controller run test` <!-- CURSOR_SUMMARY --> --- > [!NOTE] > **Medium Risk** > Modifies Across submission logic for post-quote flows, including 7702 batch handling and gas estimation, which can impact how transactions are constructed and sent on-chain. > > **Overview** > Adds Across *submit-time* support for post-quote Predict withdraws by optionally prepending the original user transaction to the submitted payload and mapping the bridge leg to `TransactionType.predictAcrossWithdraw`. > > Updates 7702 handling to force batch submission when needed (quoted combined gas limit, parent `authorizationList`, or gas-fee-token post-quote Predict withdraw), and can estimate a final `gasLimit7702` via `TransactionController:estimateGasBatch` with feature-flag gas buffer when the quoted batch shape doesn’t match the actual submit shape. > > Passes `gasFeeToken` plus `excludeNativeTokenForFee` through to single and batch submits, expands tests around these scenarios, and moves original-transaction gas parsing into a shared helper (`getOriginalTransactionGas`) reused by both quote and submit paths. > > <sup>Reviewed by [Cursor Bugbot](https://cursor.com/bugbot) for commit df05cc8. Bugbot is set up for automated code reviews on this repo. Configure [here](https://www.cursor.com/dashboard/bugbot).</sup> <!-- /CURSOR_SUMMARY -->
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
This is PR 1 of 4 in the core stack for Predict withdraws over Across.
TransactionType.predictAcrossWithdraw.isPostQuoterequests as actionable for Across support checks.Stack
Validation
yarn workspace @metamask/transaction-pay-controller run jest --no-coverage src/strategy/across/AcrossStrategy.test.tsyarn changelog:validateyarn workspace @metamask/transaction-pay-controller run testyarn workspace @metamask/transaction-controller run testNote
Medium Risk
Changes Across quote eligibility logic to treat
isPostQuoterequests as actionable and to allow EIP-7702authorizationListonly for a specific Predict-withdraw post-quote path; misclassification could incorrectly enable/disable Across quoting for some transactions.Overview
Introduces a new
TransactionType.predictAcrossWithdrawto tag Predict withdraws that will use Across.Updates
AcrossStrategy.supportsto treatisPostQuotequote requests as actionable and only accept them when the original transaction is a Predict withdraw, plus addshasUnsupportedTransactionAuthorizationListto block EIP-7702authorizationListusage except for the Predict-withdraw post-quote detection case. Tests were extended to cover post-quote Predict withdraw handling.Minor docs/logic tweaks:
isAcrossQuoteRequestnow includesisPostQuote, andrefundTocomments were generalized from Relay-specific wording to quote-provider wording.Reviewed by Cursor Bugbot for commit fc6f92e. Bugbot is set up for automated code reviews on this repo. Configure here.